/**
 * @Copyright 
 * @Project vchat
 * @CreateTime 2015-12-24 下午9:09:53 @wxyz create file
 */
package wxyz.test4jweb.utils;

import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Level;

/**
 * <p>
 * 日志工具类
 * </p>
 * @CreateTime 2015-12-24 下午9:09:53 @wxyz init class
 */
public class Logger {

	/**
	 * 日志集合，根据不同的类，提供不同的日志记录器
	 */
	private static final Map<Class<?>, org.apache.log4j.Logger> loggers = new HashMap<>();
	
	/**
	 * 新建日志记录器锁
	 */
	private static final Object newLoggerLock = new Object();
	
	/**
	 * 日志级别
	 */
	private static Level level = null;
	
	/**
	 * <p>
	 * 获取特定类的日志记录器
	 * </p>
	 * @param clz 类
	 * @return
	 * @CreateTime 2015-12-24 下午9:30:53 @wxyz create method
	 */
	private static org.apache.log4j.Logger getLogger(Class<?> clz) {
		org.apache.log4j.Logger logger = null;
		// 存在，则直接返回
		if (loggers.containsKey(clz)) {
			logger = loggers.get(clz);
		}
		else {
			// 尝试加锁
			synchronized (newLoggerLock) {
				// 锁定后，验证没有被其他线程创建
				if (!loggers.containsKey(clz)) {
					logger = org.apache.log4j.Logger.getLogger(clz);
					if (null != level) {
						logger.setLevel(level);
					}
					loggers.put(clz, logger);
				}
				// 如果其他线程创建了，则直接返回记录器
				else {
					logger = loggers.get(clz);
				}
			}
		}
		
		return logger;
	}
	
	/**
	 * <p>
	 * 日志日志级别
	 * </p>
	 * @param level
	 * @CreateTime 2015-12-25 上午12:47:37 @wxyz create method
	 */
	public static void setLevel(String level) {
		if (null == level || "".equals(level)) {
			return ;
		}
		
		Logger.level = Level.toLevel(level.toUpperCase());
	}
	
	/**
	 * <p>
	 * 调试日志
	 * </p>
	 * @param clz 类
	 * @param msg 消息
	 * @CreateTime 2015-12-24 下午9:11:51 @wxyz create method
	 */
	public static void debug(Class<?> clz, String msg) {
		org.apache.log4j.Logger logger = getLogger(clz);
		if (logger.isDebugEnabled()) {
			logger.debug(msg);
		}
	}
	
	/**
	 * <p>
	 * 普通日志
	 * </p>
	 * @param clz 类
	 * @param msg 消息
	 * @CreateTime 2015-12-24 下午9:35:51 @wxyz create method
	 */
	public static void info(Class<?> clz, String msg) {
		org.apache.log4j.Logger logger = getLogger(clz);
		if (logger.isInfoEnabled()) {
			logger.info(msg);
		}
	}
	
	/**
	 * <p>
	 * 警告日志
	 * </p>
	 * @param clz 类
	 * @param msg 消息
	 * @CreateTime 2015-12-24 下午9:36:27 @wxyz create method
	 */
	public static void warn(Class<?> clz, String msg) {
		getLogger(clz).warn(msg);
	}
	
	/**
	 * <p>
	 * 警告日志
	 * </p>
	 * @param clz 类
	 * @param msg 消息
	 * @param e 异常消息
	 * @CreateTime 2015-12-24 下午9:36:27 @wxyz create method
	 */
	public static void warn(Class<?> clz, String msg, Throwable e) {
		getLogger(clz).warn(msg, e);
	}
	
	/**
	 * <p>
	 * 错误日志
	 * </p>
	 * @param clz 类
	 * @param msg 消息
	 * @CreateTime 2015-12-24 下午9:37:23 @wxyz create method
	 */
	public static void error(Class<?> clz, String msg) {
		getLogger(clz).error(msg);
	}
	
	/**
	 * <p>
	 * 错误日志
	 * </p>
	 * @param clz 类
	 * @param msg 消息
	 * @param e 异常消息
	 * @CreateTime 2015-12-24 下午9:37:23 @wxyz create method
	 */
	public static void error(Class<?> clz, String msg, Throwable e) {
		getLogger(clz).error(msg, e);
	}
}
